home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Online / opennap / spyserv.c < prev    next >
C/C++ Source or Header  |  2001-06-08  |  4KB  |  188 lines

  1. /* Copyright (C) 2000-1 drscholl@users.sourceforge.net
  2.    This is free software distributed under the terms of the
  3.    GNU Public License.  See the file COPYING for details.
  4.  
  5.    $Id: spyserv.c,v 1.10 2001/02/15 08:39:45 drscholl Exp $ */
  6.  
  7. /* a simple proxy server to spy on the traffic between client and server.  this
  8.    is a lot easier than using tcpdump.  use the fake metaserver to redirect
  9.    clients to this server */
  10.  
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <unistd.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <arpa/inet.h>
  17.  
  18. unsigned char buf[2048];
  19.  
  20. #define NAP_SERVER "208.49.239.247"
  21. #define NAP_PORT 6666
  22.  
  23. int
  24. read_bytes (int fd, int n, unsigned char *b)
  25. {
  26.     int t = 0, l;
  27.  
  28.     while (t < n)
  29.     {
  30.     l = read (fd, b + t, n - t);
  31.     if (l <= 0)
  32.     {
  33.         if (l == -1)
  34.         perror ("read");
  35.         puts ("read_bytes(): error reading data");
  36.         return -1;
  37.     }
  38.     t += l;
  39.     }
  40.     return t;
  41. }
  42.  
  43. int
  44. pass_message (const char *id, int s, int d)
  45. {
  46.     int len;
  47.  
  48.     if (read_bytes (s, 4, buf) == -1)
  49.     return -1;
  50.  
  51.     len = buf[0] | (buf[1] << 8);
  52.     if (read_bytes (s, len, buf + 4) == -1)
  53.     return -1;
  54.     buf[4 + len] = 0;
  55.     printf ("%s: tag=%d, len=%d, data=%s\n",
  56.         id, buf[2] | (buf[3] << 8), len, (char *) buf + 4);
  57.  
  58.     write (d, buf, 4 + len);
  59.     return 0;
  60. }
  61.  
  62. static void
  63. usage (void)
  64. {
  65.     puts ("usage: spyserv [ -s SERVER ] [ -p SERVERPORT ] [ -l LOCALPORT ]");
  66.     exit (0);
  67. }
  68.  
  69. int
  70. main (int argc, char **argv)
  71. {
  72.     int s;
  73.     int c;
  74.     int r;
  75.     int localport = 8888;
  76.     size_t sinsize;
  77.     struct sockaddr_in sin;
  78.     fd_set fds;
  79.     char *host = NAP_SERVER;
  80.     int port = NAP_PORT;
  81.  
  82.     while ((r = getopt (argc, argv, "hs:p:l:")) != EOF)
  83.     {
  84.     switch (r)
  85.     {
  86.     case 'l':
  87.         localport = atoi (optarg);
  88.         break;
  89.     case 's':
  90.         host = optarg;
  91.         break;
  92.     case 'p':
  93.         port = atoi (optarg);
  94.         break;
  95.     default:
  96.         usage ();
  97.     }
  98.     }
  99.  
  100.     /* accept connection from client */
  101.     s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
  102.     if (s < 0)
  103.     {
  104.     perror ("socket");
  105.     exit (1);
  106.     }
  107.     c = 1;
  108.     if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &c, sizeof (c)) != 0)
  109.     {
  110.     perror ("setsockopt");
  111.     exit (1);
  112.     }
  113.     memset (&sin, 0, sizeof (sin));
  114.     sin.sin_port = htons (localport);
  115.     sin.sin_family = AF_INET;
  116.     sin.sin_addr.s_addr = INADDR_ANY;
  117.     if (bind (s, &sin, sizeof (sin)) < 0)
  118.     {
  119.     perror ("bind");
  120.     exit (1);
  121.     }
  122.     if (listen (s, 1) < 0)
  123.     {
  124.     perror ("listen");
  125.     exit (1);
  126.     }
  127.     puts ("waiting for client");
  128.     if (select (s + 1, &fds, 0, 0, 0) < 0)
  129.     {
  130.     perror ("select");
  131.     exit (1);
  132.     }
  133.     sinsize = sizeof (sin);
  134.     c = accept (s, &sin, &sinsize);
  135.     if (c < 0)
  136.     {
  137.     perror ("accept");
  138.     exit (1);
  139.     }
  140.     puts ("got client");
  141.  
  142.     /* make connection to server */
  143.     printf ("connecting to server...");
  144.     fflush (stdout);
  145.     r = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
  146.     if (r < 0)
  147.     {
  148.     perror ("socket");
  149.     exit (1);
  150.     }
  151.     memset (&sin, 0, sizeof (sin));
  152.     sin.sin_port = htons (port);
  153.     sin.sin_family = AF_INET;
  154.     sin.sin_addr.s_addr = inet_addr (host);
  155.     if (connect (r, &sin, sizeof (sin)) < 0)
  156.     {
  157.     perror ("connect");
  158.     exit (1);
  159.     }
  160.     puts ("connected to server");
  161.  
  162.     for (;;)
  163.     {
  164.     FD_ZERO (&fds);
  165.     FD_SET (r, &fds);
  166.     FD_SET (c, &fds);
  167.     if (select (((r > c) ? r : c) + 1, &fds, 0, 0, 0) < 0)
  168.     {
  169.         perror ("select");
  170.         break;
  171.     }
  172.     if (FD_ISSET (r, &fds))
  173.     {
  174.         if (pass_message ("server", r, c) != 0)
  175.         break;
  176.     }
  177.     if (FD_ISSET (c, &fds))
  178.     {
  179.         if (pass_message ("client", c, r) != 0)
  180.         break;
  181.     }
  182.     }
  183.     close (r);
  184.     close (s);
  185.     close (c);
  186.     exit (0);
  187. }
  188.